package com.lgc.demo.ReflectTest.test3;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class Main {
    public static void main(String[] args) {
        try {
            ThreadLocal<Integer> ti = new ThreadLocal<Integer>();
            //ti.set();//set ,get,remove

            //为了看Object里有哪些方法
            Object object = new Object();
            //object.
            Class classP = People.class;
            boolean a= classP.isInterface();
            boolean b =TestInterface.class.isInterface();

            Class clazz = Class.forName("com.lgc.demo.ReflectTest.test3.User"); //获取整个类,也可以用下一行的
            Class clazz2 = User.class;
            Class clazz3 = User.class;
            User user = (User) clazz.newInstance();//创建此对象的一个实例

            //获取属性
            Field[] fields = clazz.getDeclaredFields();//获取所有私有属性
            Field[] fields2 = clazz.getFields();//获取所有公有属性

            //getDeclaredField获取私有属性
            Field f = clazz.getDeclaredField("name");//获取指定名称的属性
            f.setAccessible(true);
            f.set(user, "John");
            System.out.println("反射访问本类中Private修饰的属性：\n " + user.getName());
            //getField获取公有属性
            Field f2 = clazz.getField("tel");//获取指定名称的属性
            f2.set(user, "138");
            System.out.println("反射访问本类中public修饰的属性：\n " + user.getTel());

            System.out.println("--------------------------");

            //获取方法
            Method[] methods = clazz.getDeclaredMethods();//获取所有私有方法
            Method[] methods2 = clazz.getMethods();//获取所有公有方法

            //getDeclaredMethod获取私有方法
            Method setTel = clazz.getDeclaredMethod("setTel", String.class);//获取指定名称及参数类型的方法
            Method m = clazz.getDeclaredMethod("tostring");//获取指定名称没有参数的方法
            //Method m=clazz.getMethod("tostring");//不能获取私有方法,仅能获取公有方法
            m.setAccessible(true);
            System.out.println(setTel.invoke(user, "138111"));
            System.out.println(m.invoke(user));

            System.out.println(user.getTel());

            System.out.println("--------------------------");

            //找父类

            Field field = clazz.getSuperclass().getDeclaredField("peopleName");
            field.setAccessible(true);
            field.set(user, "parentNameTest");
            System.out.println("反射访问父类中Private修饰的属性：\n " + user.getPeopleName());

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void Test1() {

    }
}
